home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / minix / up1510b.tgz / up1510b / src / mm / trace.c < prev    next >
C/C++ Source or Header  |  1990-07-23  |  2KB  |  79 lines

  1. #include "mm.h"
  2. #include <signal.h>
  3. #include "mproc.h"
  4. #include "param.h"
  5.  
  6. FORWARD struct mproc *findproc();
  7.  
  8. /*===========================================================================*
  9.  *                findproc                       *
  10.  *===========================================================================*/
  11. PRIVATE struct mproc *findproc(lpid)
  12. int lpid;
  13. {
  14.   register struct mproc *rmp;
  15.  
  16.   for (rmp = &mproc[INIT_PROC_NR + 1]; rmp < &mproc[NR_PROCS]; rmp++ )
  17.     if (rmp->mp_flags & IN_USE && rmp->mp_pid == lpid) return rmp;
  18.  
  19.   return 0;
  20. }
  21.  
  22. /*===========================================================================*
  23.  *                do_trace                       *
  24.  *===========================================================================*/
  25. PUBLIC int do_trace()
  26. {
  27.   register struct mproc *child;
  28.  
  29.   if (request == 0) {  /* enable tracing by parent for this process */
  30.     mp->mp_flags |= TRACED;
  31.     mm_out.m2_l2 = 0;
  32.     return OK;
  33.   }
  34.   if ((child = findproc(pid)) == 0 || (child->mp_flags & STOPPED) == 0) {
  35.     return ESRCH;
  36.   }
  37.   if (request == 8) { /* exit */
  38.     mm_exit(child, data);
  39.     mm_out.m2_l2 = 0;
  40.     return OK;
  41.   }
  42.   if (request == 7) { /* resume execution */
  43.     if (data > _NSIG) {
  44.         return EIO;
  45.     }
  46.     if (data > 0) { /* issue signal */
  47.         child->mp_flags &= ~TRACED; /* so signal is not diverted */
  48.         sig_proc(child, (int)data);
  49.         child->mp_flags |= TRACED;
  50.     }
  51.     child->mp_flags &= ~STOPPED;
  52.   }    
  53.   if (sys_trace(request, (int)(child - mproc), (long)taddr, (long *)&data) != OK)
  54.     return -errno;
  55.   mm_out.m2_l2 = data;
  56.   return OK;
  57. }
  58.  
  59. /*===========================================================================*
  60.  *                stop_proc                       *
  61.  *===========================================================================*/
  62. PUBLIC void stop_proc(rmp, sig_nr) /* a traced process got a signal so stop */
  63. register struct mproc *rmp;
  64. int sig_nr;
  65. {
  66.   register struct mproc *rpmp = mproc + rmp->mp_parent;
  67.  
  68.   if (sys_trace(-1, (int)(rmp - mproc), 0L, (long *)0) != OK) return;
  69.   rmp->mp_flags |= STOPPED;
  70.   if (rpmp->mp_flags & WAITING) {
  71.     rpmp->mp_flags &= ~WAITING;    /* parent is no longer waiting */
  72.     reply(rmp->mp_parent, rmp->mp_pid, 0177 | (sig_nr << 8), NIL_PTR);
  73.   }
  74.   else {
  75.     rmp->mp_sigstatus = sig_nr;
  76.   }
  77.   return;
  78. }
  79.